/** 请求参数 */
export interface RQ<T> {
    //请求参数
    isPaged: boolean; // 是否分页
    ids?: Array<number>; // ids
    page: number; // 当前页码
    size: number; // 每页数量
    total: number; // 总数
    where: Array<QParam>; // 查询条件
    fileName: string; // 导出文件名
    exportType: string;  // 导出类型
}

export function initRQ<T>(): RQ<T>{
    return {
        isPaged: true,
        page: 1,
        size: 10,
        total: 0,
        where: [],
        fileName: '',
        exportType: ''
    };
}

/** 查询参数 */
export interface QParam {
    //请求参数
    name: string; // 字段名
    value: string; // 值
    type: string; // 类型
}

/**
 * 将普通对象转换为 QueryParam 数组
 * @param obj 普通对象，如 { name: "123", status: 0 }
 * @param defaultType 默认查询类型，默认为 'eq'
 * @returns QueryParam 数组
 */
export function objToQParams(obj: Record<string, any>, defaultType: string = 'eq'): QParam[] {
    if (!obj) return [];
    
    return Object.entries(obj).map(([key, value]) => ({
        name: key,
        value: value,
        type: defaultType
    }));
}

/**
 * 将单个对象转换为 QueryParam
 * @param item 包含 prop/type/value 属性的对象
 * @returns QueryParam 对象
 */
export function objToQParam(item: { prop: string; type: string; value: any }): QParam {
    return {
        name: item.prop,
        value: item.value,
        type: item.type
    };
}

/**
 * 将包含 prop/type/value 属性的对象数组转换为 QueryParam 数组
 * @param items 对象数组
 * @returns QueryParam 数组
 */
export function arrayToQueryParams(items: Array<{ prop: string; type: string; value: any }>): QParam[] {
    if (!items || items.length === 0) return [];
    
    return items.map(item => objToQParam(item));
}

/**
 * 混合转换方法：可以处理多种格式的输入
 * @param input 输入数据，可以是对象或数组
 * @param defaultType 默认查询类型
 * @returns QueryParam 数组
 */
export function toQParams(
    input: Record<string, any> | Array<{ prop: string; type: string; value: any }> | QParam[],
    defaultType: string = 'eq'
): QParam[] {
    // 如果已经是 QueryParam 数组，直接返回
    if (Array.isArray(input) && input.length > 0 && 'name' in input[0] && 'value' in input[0] && 'type' in input[0]) {
        return input as QParam[];
    }
    
    // 如果是包含 prop/type/value 的对象数组
    if (Array.isArray(input) && input.length > 0 && 'prop' in input[0]) {
        return arrayToQueryParams(input as Array<{ prop: string; type: string; value: any }>);
    }
    
    // 如果是普通对象
    if (typeof input === 'object' && input !== null && !Array.isArray(input)) {
        return objToQParams(input as Record<string, any>, defaultType);
    }
    
    return [];
}